Skip to content

chore(deploy): cap Docker container logs and enable infra deploys#52

Merged
shpaker merged 1 commit into
mainfrom
chore/docker-log-rotation
Jul 8, 2026
Merged

chore(deploy): cap Docker container logs and enable infra deploys#52
shpaker merged 1 commit into
mainfrom
chore/docker-log-rotation

Conversation

@shpaker

@shpaker shpaker commented Jul 8, 2026

Copy link
Copy Markdown
Owner

Проблема

На VDS с ботом закончилось место: / был забит на 100 %. Причина — Docker пишет логи драйвером json-file без ротации, а на сервере нет ни /etc/docker/daemon.json, ни logging: в compose. За ~3 месяца лог одного контейнера раздулся до 11 GB (плюс лог самого feedforbot — 352 MB).

Экстренная разгрузка диска и host-харденинг (fail2ban, отключение парольного SSH, лимит journald) уже сделаны на сервере напрямую. Этот PR закрывает инфраструктурную часть, связанную с ботом, чтобы проблема не повторилась.

Что меняется

  • tmfeed/deploy.playbook.yml — разворачивает /etc/docker/daemon.json с json-file / max-size=10m / max-file=3 (глобальный лимит на контейнер, покрывает и соседние стеки). Рестарт docker через handler + flush_handlers до запуска контейнеров; идемпотентно (рестарт только при изменении файла).
  • tmfeed/feedforbot.compose.yml.j2 — явный блок logging: с теми же лимитами на обоих сервисах (redis, feedforbot) — defense-in-depth и самодокументирование.
  • .github/workflows/deploy.yml — деплой теперь триггерится на любые изменения tmfeed/** (раньше — только feedforbot.config.yml) плюс добавлен workflow_dispatch (с опциональным image_tag), чтобы инфра-правки катились через CI, а не только на release.

Важное следствие

Деплой по push тянет ghcr.io/shpaker/feedforbot:latest (сейчас 5.1.0), а на сервере крутится 4.0.0rc7этот деплой заодно обновит feedforbot до 5.1.0 (согласовано).

⚠️ Лимиты логов применяются только к контейнерам, пересозданным после изменения — плейбук делает --force-recreate, так что стек feedforbot подхватит их при этом деплое.

Проверка

  • mypy/ruff не затрагиваются (только YAML); ansible-playbook --syntax-check — OK.
  • После мержа: джоб deploy зелёный; на сервере docker inspect feedforbot --format '{{.HostConfig.LogConfig}}'max-size:10m max-file:3; feedforbot healthy, версия 5.1.0, посты идут в @tmfeed.

Docker used the default json-file driver with no rotation, so container
logs grew unbounded and filled the VDS disk (an 11GB single log file).

- deploy.playbook.yml: write /etc/docker/daemon.json with
  json-file max-size=10m/max-file=3 (global cap), restart docker via
  handler + flush_handlers before containers start.
- feedforbot.compose.yml.j2: explicit logging: block on both services
  (defense-in-depth, self-documenting).
- deploy.yml: trigger deploy on any tmfeed/** change and add
  workflow_dispatch (optional image_tag), so infra-only changes ship
  via CI instead of only on release/config.yml pushes.
@shpaker shpaker merged commit 8ea1ef9 into main Jul 8, 2026
10 checks passed
@shpaker shpaker deleted the chore/docker-log-rotation branch July 8, 2026 09:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant